import { IProtocol, IProtocolMsg } from "./IProtocol";

export default class ProtocolPool {
    private protocols: { [msgId: number]: { protocol: IProtocol, onMsg?: Function } } = {};
    private decodeProtocols: { [msgId: number]: { protocol: IProtocol, onMsg?: Function } } = {};
    register<T>(msgId: number, protocol: IProtocol, onMsg?: IProtocolMsg<T>, force = false) {
        if (this.protocols[msgId] && !force) {
            this.protocols[msgId].onMsg = onMsg
            return;
        }
        this.protocols[msgId] = { protocol, onMsg }
    }

    registerDecodeProtocol<T>(msgId: number, protocol: IProtocol, onMsg?: IProtocolMsg<T>) {
        if (this.decodeProtocols[msgId]) {
            this.decodeProtocols[msgId].onMsg = onMsg
            return;
        }
        this.decodeProtocols[msgId] = { protocol, onMsg }
    }

    recive(msgId: number, buffer: Uint8Array) {
        let p = this.decodeProtocols[msgId]
        if (!p)
            p = this.protocols[msgId];
        if (!p) {
            console.error(`Unknow protocol: ${msgId}, please register`);
            return;
        }
        const data = p.protocol.decode(buffer);
        console.log(`onMessage: \nmsgId -> ${msgId} \ndataLen -> ${buffer.length} \nbody -> `, data);
        p.onMsg && p.onMsg(data);
    }

    getProtocol(msgId: number) {
        return this.protocols[msgId].protocol;
    }
}